package com.huishou.lajiMain.config.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.fill.Column;
import org.springframework.stereotype.Service;

import java.util.Collections;

/*
 * @Author:大力王
 * @Date:2024/5/11-11-1:18
 * 开始了
 */
@Service
public class CodeGenerator {
    //项目包路径
    private final String packageNames = "com.huishou.lajiMain";

    /**
     * 根据表名生成代码
     * @param tableName 需要生成代码的表名
     * @param noController 是否不生成Controller代码，true表示不生成，false表示生成
     */
    public void generator(String tableName, boolean noController) {
        // 获取工程根目录地址，并设置Java代码和Mapper XML文件的输出路径
        String systemUrlJava = System.getProperty("user.dir")+"\\src\\main\\java\\";
        String systemUrlMapper = System.getProperty("user.dir")+"\\src\\main\\resources\\mapper\\";

        // 开始代码生成，配置全局属性
        //数据库地址
        String url = "jdbc:mysql://localhost:3306/springboot?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.author("大力王") // 设置代码作者
                            .enableSwagger() // 开启Swagger模式
                            .outputDir(systemUrlJava) // 设置输出目录
                            .disableOpenDir(); // 禁止自动打开输出目录
                })
                // 配置包信息
                .packageConfig(builder -> {
                    builder.parent(packageNames) // 设置父包名
                            .pathInfo(
                                    // 设置Mapper XML文件生成路径
                                    Collections.singletonMap(OutputFile.xml, systemUrlMapper)
                            );
                })
                // 配置策略
                .strategyConfig(builder -> {
                    builder.entityBuilder()
                            .logicDeleteColumnName("deleted") // 设置逻辑删除字段
                            .enableLombok() // 开启Lombok支持
                            .idType(IdType.AUTO) // 设置ID生成策略
                            .addTableFills(
                                    // 设置自动填充字段
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_time", FieldFill.INSERT_UPDATE)
                            );
                    builder.mapperBuilder().enableMapperAnnotation().build(); // 启用@Mapper注解
                    builder.controllerBuilder().enableHyphenStyle().enableRestStyle(); // 启用驼峰转连字符风格并启用RESTful风格
                    builder.addInclude(tableName); // 指定需要生成代码的表
                })
                // 配置模板
                .templateConfig(builder -> {
                    // 如果指定不生成Controller，则禁用Controller模板
                    if(noController){
                        builder.disable(TemplateType.CONTROLLER);
                    }
                })
                // 执行代码生成
                .execute();
    }
}
